package com.adisi.servlets;


import com.adisi.objetos.AutoManager;
import com.adisi.objetos.Chofer;
import com.adisi.objetos.ChoferManager;
import com.adisi.objetos.Cliente;
import com.adisi.objetos.ClienteManager;
import com.adisi.objetos.Documento;
import com.adisi.objetos.Domicilio;
import com.adisi.objetos.EstadoViaje;
import com.adisi.objetos.Jornada;
import com.adisi.objetos.JornadaEstado;
import com.adisi.objetos.JornadaManager;
import com.adisi.objetos.PuntoRuta;
import com.adisi.objetos.Seguridad;
import com.adisi.objetos.Telefono;
import com.adisi.objetos.TelefonoManager;
import com.adisi.objetos.TipoDocumento;
import com.adisi.objetos.Usuario;
import com.adisi.objetos.Viaje;
import com.adisi.objetos.Reserva;
import com.adisi.objetos.ViajeManager;
import com.adisi.objetos.ReservaManager;

import java.io.IOException;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * Servlet implementation class UsuarioServlet
 */

@WebServlet(description = "Clase para listar los clientes.", urlPatterns = { "/clientes" })
public class  ViajeServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
    public void init() throws ServletException {
    
    }	
	
	
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ViajeServlet() {
        super();
        
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		Usuario usuario = (Usuario)request.getSession().getAttribute("usuario");
		
		String msg = null;
		String msgType = null;		
		
		if(Seguridad.validarUsuarioProceso(usuario, "Operaciones")==false) {
			
			response.setContentType("text/html");
			
			request.getRequestDispatcher("index.jsp").forward(request, response);			
		} else {
		
			int idCliente = 0;
			int idViaje = 0;
			
			String pag = "cliente.jsp";
			
			if(request.getParameter("ce")!=null) {
				//Es cierre
				idViaje = Integer.parseInt(request.getParameter("ce"));
							
				Viaje viaje = null;
				try {
					viaje = ViajeManager.conseguirUnViaje(idViaje);
				} catch (Exception e) {
					e.printStackTrace();
				}
				
				request.setAttribute("viaje", viaje);
				request.setAttribute("accion", "cerrar");
				
				pag = "cierreViaje.jsp";
				
			} else if(request.getParameter("ru")!=null) {
				//Es cierre
				idViaje = Integer.parseInt(request.getParameter("ru"));
							
				Viaje viaje = null;
				try {
					viaje = ViajeManager.conseguirUnViaje(idViaje);

					ViajeManager.cargarRuta(viaje);
					
				} catch (Exception e) {
					e.printStackTrace();
				}
				
				request.setAttribute("viaje", viaje);
				request.setAttribute("accion", "cerrar");
				
				pag = "ruta.jsp";
				
			} else {
				
				if(Seguridad.validarUsuarioProceso(usuario, "VerJornadas")) {
					
					List<Jornada> jornadas = new ArrayList<Jornada>();
					
					try {
						
						jornadas = JornadaManager.listar();
						
						request.setAttribute("jornadas", jornadas);
						
						pag = "planillaDiaria.jsp";
						
					} catch (Exception e) {
						
						pag = "inicio.jsp";
						
						msg = e.getMessage();
						msgType = "danger";
					}
					
				} else {
				
					msg = "No tiene permiso de acceder a esta secci&oacute;n.";
					msgType = "warning";
					
					pag = "inicio.jsp";
					
				}
				
			}
			
			response.setContentType("text/html");
			
			request.setAttribute("msg", msg);
			request.setAttribute("msg_type", msgType);			
			
			request.getRequestDispatcher(pag).forward(request, response);
		}
		
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		String msg = null;
		String msgType = null;
		
		String pag = "viajes.jsp";
			
		String accion = "";
		
		Telefono telefono = null;
		Documento documento = null;
		
		Cliente cliente = new Cliente();
		
		response.setContentType("text/html");
		
		accion = request.getParameter("accion");
		
		if(accion.equalsIgnoreCase("altaForm")) {
			
			List<Jornada> jornadas = new ArrayList<Jornada>();
			
			try {
				jornadas = JornadaManager.listar(JornadaEstado.DISPONIBLE);

			
				request.setAttribute("disponibles", jornadas);
			

				if(request.getParameter("porDoc") != null) {
					
					String nro = request.getParameter("nro");
					
					documento = new Documento(TipoDocumento.OTRO, nro);
					
					cliente = ClienteManager.conseguirUnCliente(documento );
					
					if(cliente==null)
					{
						//TODO Presentar pantalla de viaje con alta de cliente
						pag = "viaje.jsp";
						
						cliente = new Cliente(0,"Nuevo Cliente","");
						cliente.setDocumento(documento);
						
						request.setAttribute("cliente", cliente);
												
						request.setAttribute("accion", "alta");		
					}
					else
					{
						//Presentar pantalla de alta de viaje con cliente conocido
						pag = "viaje.jsp";
						
						request.setAttribute("cliente", cliente);
						
						telefono = TelefonoManager.conseguirUnTelefono(nro);
						
						request.setAttribute("telefono", telefono);
						
					}
					
				}
				else {
					//Buscamos al cliente por telefono

					String nro = request.getParameter("nro");
					
					telefono = TelefonoManager.conseguirUnTelefono(nro);
					
					if(telefono!=null){
						cliente = ClienteManager.conseguirUnCliente(telefono.getIdCliente() );
					} else {
						cliente = null;
					}
					
					if(cliente==null)
					{
						//TODO Presentar pantalla de viaje con alta de cliente
						pag = "viaje.jsp";
						
						request.setAttribute("cliente", new Cliente(0,"Nuevo Cliente",""));
						
						telefono = new Telefono();
						
						telefono.setNumero(nro);
						
						request.setAttribute("telefono", telefono);
						request.setAttribute("accion", "alta");		
					}
					else
					{
						//Presentar pantalla de alta de viaje con cliente conocido
						pag = "viaje.jsp";
						
						request.setAttribute("cliente", cliente);
						
						telefono = TelefonoManager.conseguirUnTelefono(nro);
						
						request.setAttribute("telefono", telefono);
						
					}
				}
				
			}
			catch(NullPointerException e){
				msg = e.getMessage();
				msgType = "danger";
			}
			catch(NumberFormatException e){
				msg = "El n&uacute;mero ingresado tiene un formato err&oacute;neo.";
				msgType = "danger";
				pag = "error.jsp";
			}
			catch(Exception e){
				msg = e.getMessage();
				msgType = "close";
				
			}
			
		} else if(accion.equalsIgnoreCase("nuevo")) {
			
			boolean altaOk = false;
			
			pag = "jornada?lst";
			
			try {
				altaOk = altaViajeNuevo(request, response);
				
			} catch (Exception e) {
				
				msg = e.getMessage();
				msgType = "danger";
				
				pag = "inicio.jsp";
			}
			
			
		} else if(accion.equalsIgnoreCase("cerrar")) {
			
			int idViaje = Integer.parseInt(request.getParameter("id_viaje"));
			BigDecimal kms = new BigDecimal(request.getParameter("kms_auto"));
			
			Viaje viaje = null;
			
			try {
				viaje = ViajeManager.conseguirUnViaje(idViaje);
				
				ViajeManager.cerrarViaje(viaje, kms);
				
				pag = "jornada?lst";
				
			} catch (Exception e) {
			
				pag = "inicio.jsp";
				
				msg = e.getMessage();
				msgType = "danger";
			} 
			finally {
				if(viaje != null && AutoManager.verificarAlertas(viaje.getJornada().getAuto())) {
					msg = viaje.getJornada().getAuto().getAlertaCercana().getMensaje();
					msgType = "warning";
				}
			}	
			
		} else if(accion.equalsIgnoreCase("cerrar2")) {
			
			String imei = request.getParameter("imei");
			BigDecimal kms = new BigDecimal(request.getParameter("kms"));
			
			
			pag = null;
			
			Viaje viaje = null;
			
			try {
				viaje = ViajeManager.conseguirUnViaje(imei);
				
				ViajeManager.cerrarViaje(viaje, kms);
				
				pag = "ok.json";
				
			} catch (Exception e) {
			
			} 
			
		} else if(accion.equalsIgnoreCase("agpr")) {
			
			float latitud = Float.parseFloat(request.getParameter("latitud"));
			float longitud = Float.parseFloat(request.getParameter("longitud"));
			Date hora = new Date(Long.parseLong(request.getParameter("hora")));
			String imei = request.getParameter("imei");

			PuntoRuta punto = new PuntoRuta(latitud, longitud, hora, imei);
			
			 pag = null;
			
			try {
				ViajeManager.grabarPuntoRuta(punto);
				
				response.setContentType("application/json");
				
				pag = "ok.json";
				
			} catch (IOException e) {
				throw e;
			}catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		
		if(pag != null) {
			if(pag.equals("viaje.jsp"))
				request.setAttribute("accion", "nuevo");
	
			request.setAttribute("msg", msg);
			request.setAttribute("msg_type", msgType);
			
			request.getRequestDispatcher(pag).forward(request, response);			
		}
	}
	
	private boolean altaViajeNuevo(HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		String tipo;
		Cliente cliente;
		Domicilio origen;
		Domicilio destino;
		Telefono telefono;
		
		boolean resp = true;
		
		try{			
			origen = new Domicilio(
					request.getParameter("origen_calle_domicilio"),
					request.getParameter("origen_altura_domicilio"),
					request.getParameter("origen_piso_domicilio"),
					request.getParameter("origen_dpto_domicilio"),
					request.getParameter("origen_localidad_domicilio"),
					request.getParameter("origen_pcia_domicilio")
					);

			destino = new Domicilio(
					request.getParameter("destino_calle_domicilio"),
					request.getParameter("destino_altura_domicilio"),
					request.getParameter("destino_piso_domicilio"),
					request.getParameter("destino_dpto_domicilio"),
					request.getParameter("destino_localidad_domicilio"),
					request.getParameter("destino_pcia_domicilio")
					);
			
			int idCliente =Integer.parseInt(request.getParameter("cliente_id"));
			String nroTelefono = request.getParameter("cliente_telefono");
			
			if(idCliente==0)
			{
				cliente = new Cliente(0, request.getParameter("cliente_nombre"), "");
				telefono = new Telefono(nroTelefono, origen, "Ref. 1", 0);
				cliente.setTelefono(telefono);
				
				ClienteManager.grabarUnCliente(cliente);
			}
			else
			{
				cliente = ClienteManager.conseguirUnCliente(idCliente);
				telefono = TelefonoManager.conseguirUnTelefono(nroTelefono);
				if(telefono==null)
				{
					telefono = new Telefono(nroTelefono, origen, "Nueva Ref.", cliente.getIdCliente());
					cliente.setTelefono(telefono);
					
					TelefonoManager.grabarUnTelefono(telefono);
				}
			}
			
			tipo = request.getParameter("tipo");
			
			if(tipo.equals("I")) {
			
				int idJornada = Integer.parseInt(request.getParameter("jornada"));
				
				Viaje viaje = new Viaje(0, JornadaManager.conseguirUnaJornada(idJornada), cliente, origen, destino, new Date(), null, EstadoViaje.VIAJANDO );
				
				ViajeManager.grabarUnViaje(viaje);
			} else {
				SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy hh:mm");
				
				Date fecha = null;
				
				String fechaHora = request.getParameter("fecha_reserva") + " " + request.getParameter("hora_reserva");
				
				try {
					fecha = df.parse(fechaHora);
					
					Usuario usuario = (Usuario) request.getSession().getAttribute("usuario");
					
					Reserva reserva = new Reserva(cliente, origen, destino, fecha, 10, usuario);
					
					ReservaManager.guardarReserva(reserva);
					
				} catch (ParseException e) {
					throw e;
				} 	
			}
			
		}
		catch(NullPointerException e){
			throw e;

		}
		catch(Exception e){
			throw e;

		}
		
		return resp;
	
	}

}
